package org.gzr.myreflect.getconstructors;


import org.gzr.myreflect.getconstructors.entity.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 获取构造方法
 * Constructor<?>[] getConstructors()获得所有的构造（只能public修饰）
 * Constructor<?>[] getDeclaredConstructors()获得所有的构造（包含private修饰）
 * Constructor<T> getConstructor(Class<?>... parameterTypes)获取指定构造（只能public修饰）
 * Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)获取指定构造（包含private修饰）
 */
public class MyConstructors {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //1.获取字节码文件
        Class aClass = Class.forName("org.gzr.myreflect.getconstructors.entity.Student");

        //2.获取所有public的构造方法
        Constructor[] constructors = aClass.getConstructors();
        for (Constructor constructor:constructors) {
            System.out.println(constructor);
        }

        System.out.println("=====");

        //3.获取所有构造（带私有的）
        Constructor[] declaredConstructors = aClass.getDeclaredConstructors();
        for (Constructor constructor:declaredConstructors) {
            System.out.println(constructor);
        }

        System.out.println("=====");

        //4.获取指定的空参构造
//        Constructor constructor = aClass.getConstructor();
//        System.out.println(constructor);

        //5.获取有参构造
        Constructor constructor1 = aClass.getDeclaredConstructor(String.class,int.class);
        System.out.println(constructor1);

        //测试1
        //需求获取空参，并创建对象
        Constructor constructor = aClass.getConstructor();
        Student student = (Student) constructor.newInstance();
        System.out.println(student);

        System.out.println("=====");

        //测试2
        //获取带参构造，并创建对象
        Constructor constructor2 = aClass.getDeclaredConstructor(String.class,int.class);
        //3.临时修改构造方法的访问权限（暴力反射）
        constructor2.setAccessible(true);
        //4.直接创建对象
        Student student1 = (Student) constructor2.newInstance("张三", 18);
        System.out.println(student1);

    }
}
